package top.stmo;

import org.junit.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JDBCTest2 {

    /**
     *      JDBC 快速入门
     *
     *      DriverManager.registerDriver(new Driver());
     *
     *      构造Driver对象的时候,静态代码块调用DriverManager的静态方法自动new Driver 注册了驱动
     *
     *      可以配置 useSSL=false 参数，禁用安全连接方式，解决警告提示
     *
     */
    public static void main(String[] args) throws Exception {
/**
 *      Connection
 *
 *      Connection（数据库连接对象）作用：
 *      获取执行 SQL 的对象
 *      管理事务
 *
 *      普通执行SQL对象
 *      Statement createStatement()
 *
 *      预编译SQL的执行SQL对象：防止SQL注入
 *      PreparedStatement prepareStatement(sql)
 *
 *      事务管理：
 *       开启事务 ： conn.setAutoCommit(false)(自动提交事务，true表示自动提交，false表示手动提交)
 *       提交事务 ： COMMIT;
 *       回滚事务 ： ROLLBACK;
 *
 *      Statement：
 *          Statement对象的作用就是用来执行SQL语句。而针对不同类型的SQL语句使用的方法也不一样。
 *
 *      执行DDL、DML语句：    executeUpdate(String sql)
 *
 *      执行DQL语句：         executeQuery(String sql)
 *
 */
        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");

        //获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/test1?characterEncoding=" +
                "UTF8&autoReconnect=true&useSSL=false";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url, username, password);
        Statement stmt = null;

        try {
            //开启事务
            conn.setAutoCommit(false);

            //获取执行sql的对象
            stmt = conn.createStatement();

            //定义sql语句
            String sql = "update tb_user set name = '子牙' where id = 24";

            //执行sql
            int i = stmt.executeUpdate(sql);
            System.out.println(i);

            //抛出异常
            int a = 1/0;

            String sql2 = "update tb_user set name = '后羿' where id = 23";

            int i2 = stmt.executeUpdate(sql2);
            System.out.println(i2);

            //提交事务
            conn.commit();
        } catch (Exception throwables) {
            conn.rollback();
            throwables.printStackTrace();
        } finally {
            //释放资源
            stmt.close();
            conn.close();
        }

    }

    /**
     *   执行DQL语句：         executeQuery(String sql)
     *
     *   boolean next()     将光标从当前位置向前移动一行,判断当前行是否为有效行
     *   方法返回值说明：    true：有效航，当前行有数据    false：无效行，当前行没有数据
     *
     *   xxx getXxx(参数)：获取数据
     *   xxx : 数据类型；如： int getInt(参数) ；String getString(参数)
     *
     *   参数
     *   int类型的参数：列的编号，从1开始
     *   String类型的参数： 列的名称
     *
     */
    @Test
    public void test1() throws Exception {

        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");

        //获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/test1?characterEncoding=" +
                "UTF8&autoReconnect=true&useSSL=false";

        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url, username, password);

        //获取执行sql的对象
        Statement stmt = conn.createStatement();

        //定义sql语句
        String sql = "select id,name,phone from tb_user where id < 5";

        //执行sql
        ResultSet resultSet = stmt.executeQuery(sql);

        //遍历ResultSet中的数据
        while (resultSet.next()) {
            //获取数据
            int anInt = resultSet.getInt(1);
            String string = resultSet.getString(2);
            long l1 = resultSet.getLong(3);

            System.out.print(anInt + ",");
            System.out.print(string + ",");
            System.out.println(l1 + ",");
        }

        //释放资源
        stmt.close();
        conn.close();

    }

}
